package org.yxt.springcloud.controller;

import com.netflix.hystrix.contrib.javanica.annotation.DefaultProperties;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixProperty;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.yxt.springcloud.entities.CommonResult;
import org.yxt.springcloud.serivce.PaymentHystrixService;

import javax.annotation.Resource;

/**
 * 接口的调用使用OpenFeign 和 hystrix 在controller中使用Hystrix仅仅是对controller上调用做服务降级，
 * 在service中PaymentHystrixFallbackService是针对整个对服务端的接口做降级处理
 *
 * @author Yang douya
 * @date 2022-01-03
 */
@RestController
@RequestMapping(value = "consumer")
@DefaultProperties(defaultFallback = "globalHystrixFallbackMethod")
public class ConsumerOrderController {

    @Resource
    private PaymentHystrixService paymentHystrixService;

    /**
     * 使用openFeign客户端调用 服务端无耗时
     *
     * @param id
     * @return
     */
    @GetMapping(value = "hystrix/payment/ok/{id}")
    public CommonResult ok(@PathVariable("id") int id) {
        return paymentHystrixService.ok(id);
    }

    /**
     * 使用openFeign客户端调用 服务端耗时操作
     * 消费端服务降级 当请求大于1.5秒后自动进入降级 防止服务端响应慢而消费端卡死等待
     *
     * @param id
     * @return
     */
    @HystrixCommand(fallbackMethod = "failFallbackHandler", commandProperties = {
            @HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "15000")
    })
    @GetMapping(value = "hystrix/payment/fail/{id}")
    public CommonResult fail(@PathVariable("id") int id) {
        return paymentHystrixService.fail(id);
    }

    /**
     * 使用全局的降级兜底方法
     *
     * @return
     */
    @GetMapping(value = "hystrix/fallback")
    @HystrixCommand()
    public CommonResult fallback() {
        int age = 10 / 0;
        return new CommonResult(1, "success");
    }

    /**
     * 服务降级处理方法
     *
     * @param id
     * @return
     */
    public CommonResult failFallbackHandler(@PathVariable("id") int id) {
        return new CommonResult(0, "消费者客户端请求响应大于1.5秒， 已经进入服务降级处理 处理线程 " + Thread.currentThread().getName());
    }

    /**
     * 全局的服务降级方法
     *
     * @return
     */
    public CommonResult globalHystrixFallbackMethod() {
        String data = "@DefaultProperties(defaultFallback = \"globalHystrixFallbackMethod\")配置默认的全局的服务降级处理方法，@HystixCommand可以不写fallbackMethod，就会直接使用默认的全局的兜底方法，如果在@HystixCommand(fallbackMethod)指定了降级处理方法，将使用指定不调用全局的配置";
        return new CommonResult(0, "全局的服务降级兜底方法", data);
    }
}
